package com.hy.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hy.medicine.MedicineStockRecord;
import com.hy.medicine.dto.BatchStockOperateDTO;
import com.hy.medicine.dto.StockOperateDTO;
import com.hy.medicine.dto.StockQueryDTO;
import com.hy.medicine.dto.StockRecordQueryDTO;
import com.hy.medicine.vo.MedicineStockVO;
import com.hy.service.MedicineStockService;
import com.hy.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;

/**
 * 药品库存管理
 */
@Slf4j
@RestController
@RequestMapping("/medicineStock")
@Api(tags = "药品库存管理")
public class MedicineStockController {

    @Autowired
    private MedicineStockService medicineStockService;


        /**
     * 处理查询库存列表的POST请求
     *
     * @param dto 包含查询条件的StockQueryDTO对象，通过请求体传递
     * @return 返回一个Result对象，其中包含查询到的库存列表信息
     *
     * 该方法用于根据传入的查询条件获取库存列表。
     * 方法首先记录查询参数的日志。
     * 然后调用medicineStockService的getStockList方法来获取库存列表数据。
     * 如果在整个过程中没有发生异常，则返回包含库存列表信息的成功Result对象。
     * 如果发生任何异常，方法将捕获异常并在日志中记录错误信息，然后返回一个表示查询失败的Result对象。
     */
    @PostMapping("/list")
    @ApiOperation("查询库存列表")
    public Result getStockList(@RequestBody StockQueryDTO dto) {
        try {
            log.info("查询库存列表 - 参数: {}", dto); // 记录查询参数的日志
            return medicineStockService.getStockList(dto); // 调用服务层方法获取库存列表
        } catch (Exception e) {
            log.error("查询库存列表失败", e); // 记录错误日志
            return Result.error("查询库存列表失败"); // 返回错误信息
        }
    }


        /**
     * 处理查询库存变动记录的POST请求
     *
     * @param dto 包含查询条件的StockRecordQueryDTO对象，通过请求体传递
     * @return 返回一个Result对象，其中包含查询到的库存变动记录信息
     *
     * 该方法用于根据传入的查询条件获取库存变动记录。
     * 方法首先记录查询参数的日志。
     * 然后调用medicineStockService的getStockRecords方法来获取库存变动记录数据。
     * 如果在整个过程中没有发生异常，则返回包含库存变动记录信息的成功Result对象。
     * 如果发生任何异常，方法将捕获异常并在日志中记录错误信息，然后返回一个表示查询失败的Result对象。
     */
    @PostMapping("/records")
    @ApiOperation("查询库存变动记录")
    public Result getStockRecords(@RequestBody StockRecordQueryDTO dto) {
        try {
            log.info("查询库存变动记录 - 参数: {}", dto); // 记录查询参数的日志
            return medicineStockService.getStockRecords(dto); // 调用服务层方法获取库存变动记录
        } catch (Exception e) {
            log.error("查询库存变动记录失败", e); // 记录错误日志
            return Result.error("查询库存变动记录失败"); // 返回错误信息
        }
    }


        /**
     * 处理药品入库的POST请求
     *
     * @param dto 包含入库信息的StockOperateDTO对象，通过请求体传递，并且使用@Validated注解进行验证
     * @return 返回一个Result对象，表示入库操作的结果
     *
     * 该方法用于处理药品入库操作。
     * 方法首先记录入库参数的日志。
     * 然后调用medicineStockService的stockIn方法来执行入库操作。
     * 如果在整个过程中没有发生异常，则返回表示入库成功的Result对象。
     * 如果发生任何异常，方法将捕获异常并在日志中记录错误信息，然后返回一个包含错误信息的Result对象。
     */
    @PostMapping("/in")
    @ApiOperation("药品入库")
    public Result stockIn(@Validated @RequestBody StockOperateDTO dto) {
        try {
            log.info("药品入库 - 参数: {}", dto); // 记录入库参数的日志
            return medicineStockService.stockIn(dto); // 执行入库操作
        } catch (Exception e) {
            log.error("药品入库失败", e); // 记录错误日志
            return Result.error("药品入库失败: " + e.getMessage()); // 返回错误信息
        }
    }


        /**
     * 处理药品出库的POST请求
     *
     * @param dto 包含出库信息的StockOperateDTO对象，通过请求体传递，并且使用@Validated注解进行验证
     * @return 返回一个Result对象，表示出库操作的结果
     *
     * 该方法用于处理药品出库操作。
     * 方法首先记录出库参数的日志。
     * 然后调用medicineStockService的stockOut方法来执行出库操作。
     * 如果在整个过程中没有发生异常，则返回表示出库成功的Result对象。
     * 如果发生任何异常，方法将捕获异常并在日志中记录错误信息，然后返回一个包含错误信息的Result对象。
     */
    @PostMapping("/out")
    @ApiOperation("药品出库")
    public Result stockOut(@Validated @RequestBody StockOperateDTO dto) {
        try {
            log.info("药品出库 - 参数: {}", dto); // 记录出库参数的日志
            return medicineStockService.stockOut(dto); // 执行出库操作
        } catch (Exception e) {
            log.error("药品出库失败", e); // 记录错误日志
            return Result.error("药品出库失败: " + e.getMessage()); // 返回错误信息
        }
    }


        /**
     * 处理库存调整的POST请求
     *
     * @param dto 包含库存调整信息的StockOperateDTO对象，通过请求体传递，并且使用@Validated注解进行验证
     * @return 返回一个Result对象，表示库存调整操作的结果
     *
     * 该方法用于处理药品库存调整操作。
     * 方法首先记录库存调整参数的日志。
     * 然后调用medicineStockService的adjustStock方法来执行库存调整操作。
     * 如果在整个过程中没有发生异常，则返回表示库存调整成功的Result对象。
     * 如果发生任何异常，方法将捕获异常并在日志中记录错误信息，然后返回一个包含错误信息的Result对象。
     */
    @PostMapping("/adjust")
    @ApiOperation("库存调整")
    public Result adjustStock(@Validated @RequestBody StockOperateDTO dto) {
        try {
            log.info("库存调整 - 参数: {}", dto); // 记录库存调整参数的日志
            return medicineStockService.adjustStock(dto); // 执行库存调整操作
        } catch (Exception e) {
            log.error("库存调整失败", e); // 记录错误日志
            return Result.error("库存调整失败: " + e.getMessage()); // 返回错误信息
        }
    }


        /**
     * 处理获取库存统计信息的GET请求
     *
     * @return 返回一个Result对象，包含库存统计信息
     *
     * 该方法用于处理获取药品库存统计信息的请求。
     * 方法首先记录请求的日志。
     * 然后调用medicineStockService的getStockStats方法来获取库存统计信息。
     * 如果在整个过程中没有发生异常，则返回包含库存统计信息的Result对象。
     * 如果发生任何异常，方法将捕获异常并在日志中记录错误信息，然后返回一个表示获取库存统计信息失败的Result对象。
     */
    @GetMapping("/stats")
    @ApiOperation("获取库存统计信息")
    public Result getStockStats() {
        try {
            log.info("获取库存统计信息"); // 记录请求的日志
            return medicineStockService.getStockStats(); // 获取库存统计信息
        } catch (Exception e) {
            log.error("获取库存统计信息失败", e); // 记录错误日志
            return Result.error("获取库存统计信息失败"); // 返回错误信息
        }
    }

}



